﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Sistema.Util;
using System.Xml;
using System.Security.Cryptography.X509Certificates;
using Sistema.Dominio;
using Sistema.NFe.Xml.Interfaces;

namespace Sistema.NFe.WebServiceNFe
{
    public class CancelamentoNFe : WebServiceNFe
    {
        public CancelamentoNFe()
            : base()
        {

        }

        public Tuple<Boolean, NFeOcorrenciaVO> Cancelar(String ChaveNFe, String ProtocoloAutorizacao, String JustificativaCancelamento, X509Certificate2 certificado)
        {
            long protocolo;
            long.TryParse(ProtocoloAutorizacao, out protocolo);

            IXmlCancelamentoNFe XmlCancelamento = new Xml.XmlFactory().GetCancNFeReference();
            XmlCancelamento.ChaveNFe = ChaveNFe;
            XmlCancelamento.Versao = base.GetVersao(base._versao);
            XmlCancelamento.TipoAmbiente = base._tipoAmbiente;
            XmlCancelamento.Protocolo = protocolo;
            XmlCancelamento.JustificativaCancelamento = JustificativaCancelamento;

            XmlDocument DocumentoXmlCancelamento = new XmlDocument();
            DocumentoXmlCancelamento.LoadXml(new AssinaXML().AssinarXML(XmlCancelamento.Xml, "infCanc", certificado).OuterXml);

            ICancelamento cancelamento = base.CancelamentoNFe();
            cancelamento.DefinirCertificado(certificado);
            cancelamento.DefinirCabecalho(((int)base._cUF).ToString(), base.GetVersao(base._versao));
            XmlNode DocumentoXmlRetorno = cancelamento.Cancelar(DocumentoXmlCancelamento);

            Xml.Versao200.Mapeamento.TRetCancNFe RetCanc = new Serializacao().Deserialize<Xml.Versao200.Mapeamento.TRetCancNFe>(DocumentoXmlRetorno.OuterXml);

            if (RetCanc.infCanc.cStat == "101")
            {
                Dominio.NFeOcorrenciaVO dadosRetorno = new Dominio.NFeOcorrenciaVO();
                dadosRetorno.Protocolo = RetCanc.infCanc.nProt;
                dadosRetorno.TipoOcorrencia = TipoOcorrencia.Cancelamento;
                dadosRetorno.XmlOcorrencia = DocumentoXmlRetorno.OuterXml;
                dadosRetorno.DataOcorrencia = RetCanc.infCanc.dhRecbto;

                return new Tuple<bool, NFeOcorrenciaVO>(true, dadosRetorno);
            }
            else
            {
                return new Tuple<Boolean, NFeOcorrenciaVO>(false, null);
            }
        }
    }
}
